package com.bruce.shop.service.impl;

import com.bruce.shop.commons.utils.PasswordUtils;
import com.bruce.shop.commons.utils.SendEmail;
import com.bruce.shop.dao.BaseDao;
import com.bruce.shop.dao.UserDao;
import com.bruce.shop.dao.impl.UserDaoImpl;
import com.bruce.shop.dto.Email;
import com.bruce.shop.entity.Page;
import com.bruce.shop.entity.User;
import com.bruce.shop.service.BaseService;
import com.bruce.shop.service.UserService;
import com.sun.org.apache.bcel.internal.classfile.Code;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @author BruceXia
 * @version 1.0.0
 * @description:业务层用户接口的实现类，需要继承抽取出来的BaseServiceImpl还要实现自己的接口
 * @date 2022/9/1719:45
 */
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {

    //这里实例化了Dao层对象，父类中只是声明了并未实例化
    private UserDao userDao = new UserDaoImpl();

    @Override
    public Integer batchDel(List<String> ids) {
        return userDao.batchDel(ids);
    }

    /**
     *先判断用户是否存在，然后给密码加密
     * 设置激活码再入库
     * 发送邮件给用户提示激活
     * @param user
     * @return
     */
    @Override
    public Boolean register(User user) {
        User dbUser=userDao.selectByName(user.getUsername());
        if (dbUser!=null){
            //在数据库中查到了此用户已经被注册了，直接返回一个false
            return false;
        }
        //给密码加密
        user.setPass(PasswordUtils.hashpw(user.getPass()));
        //设置用户状态 0为激活
        user.setStatu(0);

        //设置激活码
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        user.setActiveCode(uuid);

        //入库
        Integer insert=userDao.insert(user);

        if (insert>0){
            System.out.println("入库成功！");
        }

        //邮箱发送
        Email email = new Email();
        email.setToUser(user.getEmail());
        email.setTitle("新用户激活");

        //将uuid传入
        email.setContent("欢迎注册！！，<a href ='http://localhost:8080/SSOController/activeUser?code=" + uuid + "'>点击激活</a>");
        try {
            // 邮件发送
            SendEmail.sendEmailInfoUser(email);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 通过激活码先获取用户信息，然后再修改他的状态
     * @param code
     * @return
     */
    @Override
    public Integer activeUser(String code) {
        //通过code获取其用户
        User user=userDao.selectByCode(code);
        if (user==null){
            System.out.println("激活码有误！");
            return 0;
        }

        if (user.getStatu()==0){
            //调用Dao层方法进行状态的修改
            return userDao.updateStatu(user.getId(),1);
        }
        return  0;

    }

    /**
     * 进行逻辑判断然后将不同的情况放入map中响应给前端
     * @param username
     * @param pass
     * @return
     */
    @Override
    public Map<String, Object> loginUser(String username, String pass) {
        //新建一个map用来放对种情况，放code的值，以及对应的提示
        Map<String,Object> result=new HashMap<>();
        //先给一个100，最后如果对了再覆盖200上去
        result.put("code",100);

        //通过用户名查询数据库是否存在此用户
        User user = userDao.selectByName(username);

        if (username==null||"".equals(username)){
            result.put("msg","用户名为空！");
        }else if (pass==null||"".equals(pass)){
            result.put("msg","密码为空！");
            //继续往下判断
        }else if (user==null){
            result.put("msg","用户名有误！");
        }else if (!PasswordUtils.checkpw(pass,user.getPass())){
            result.put("msg","用户名或密码有误！");
        }else{
            result.put("code",200);
            user.setPass(null);
            result.put("data",user);
        }
        return result;
    }

    /**
     * 这里重写BaseDao的目的就是给父类中的Dao初始化
     * @return
     */
    @Override
    protected BaseDao<User> getBaseDao() {
        return userDao;
    }
}
